home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MacHack 1997
/
MacHack 1997.toast
/
Hacks
/
Hacks ’96
/
ABC Hack
/
source
/
OldSaneNumerics.c
next >
Wrap
Text File
|
1996-06-21
|
3KB
|
140 lines
#define OFFSET(type, field) ((int) &((type *) 0)->field)
#define STACKOFFSET(type, A6field, field) ((int) &((type *) 0)->field - (int) &((type *) 0)->A6field)
typedef struct IUStrData {
short curChar;
short mapChar;
short decChar;
char bufChar;
char justAfter;
char ignChar;
char noFetch;
short strCnt;
long strPtr;
} IUStrData;
typedef struct IUSortFrame {
short firstRunLen;
short flag;
char pad[14];
char weakMag;
char msLock;
char weakEq;
char wantMag;
IUStrData bInfo;
IUStrData aInfo;
long oldA6;
long returnPtr;
short bStrLen;
short aStrLen;
long bStrText;
long aStrText;
} IUSortFrame;
void Init (void);
void Fetch (void);
short RunLen (char *ptr, short remainingLen);
unsigned short FixupSecondChar (IUSortFrame *sortFrame, char * remStrA, char * remStrB, short lenStrA, short lenStrB);
void main (void) {
asm {
bra Init
bra Fetch
dc.l 'NSrt' // OSType identifier
dc.l 0 // OldInit offset 8
dc.l 0 // OldFetch offset 12
dc.l 0 // OldResourceSize offset 16
}
}
void Init (void) {
asm {
move.w #0, STACKOFFSET(IUSortFrame, oldA6, flag) (a6);
lea main,a0
move.l 20(a0),d1
move.l 12(a0), d0
sub.l d1,a0
add.l d0,a0
jsr (a0)
}
}
void Fetch (void) {
asm {
tst.w STACKOFFSET(IUSortFrame, oldA6, flag)(a6)
bne @secondStr
move.w IUStrData.strCnt(a2), d0
add.w #1,d0
move.w d0, -(a7)
move.l IUStrData.strPtr(a2), -(a7)
lea main,a0
move.l 20(a0),d1
move.l 16(a0), d0
sub.l d1,a0
add.l d0,a0
jsr (a0)
jsr RunLen
add.l #6,a7
move.w d0, STACKOFFSET(IUSortFrame, oldA6, firstRunLen) (a6)
move.w #1, STACKOFFSET(IUSortFrame, oldA6, flag) (a6)
@secondStr:
move.w IUStrData.strCnt(a2), d0
add.w #1,d0
move.w d0, -(a7)
move.l IUStrData.strPtr(a2), -(a7)
jsr RunLen
add.l #6,a7
tst.w d0
beq @oldFetch
tst.w STACKOFFSET(IUSortFrame, oldA6, firstRunLen)(a6)
beq @oldFetch
cmp.w STACKOFFSET(IUSortFrame, oldA6, firstRunLen)(a6), d0
beq @oldFetch
blt @firstStrGreater
move.w #0xFF00, d4
rts
@firstStrGreater:
move.w #0x0000, d4
rts
@oldFetch:
lea main,a0
move.l 20(a0),d1
move.l 16(a0), d0
sub.l d1,a0
add.l d0,a0
jsr (a0)
rts
}
}
short RunLen (char *ptr, short remainingLen) {
short runLen = 0;
while ((remainingLen > 0) && (*ptr >= '0') && (*ptr <= '9')) {
++runLen;
++ptr;
--remainingLen;
}
return runLen;
}
unsigned short FixupSecondChar (IUSortFrame *sortFrame, char * remStrA, char * remStrB, short lenStrA, short lenStrB) {
}